home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 142
/
Gekkan Dennou Club - 2000.3 Vol. 142 (Japan).7z
/
Gekkan Dennou Club - 2000.3 Vol. 142 (Japan) (Track 1).bin
/
tools
/
s_tool
/
subg.c
< prev
next >
Wrap
Text File
|
1997-10-25
|
26KB
|
1,095 lines
#include "JX250.H"
#include <sys\iocs.h>
#include <sys\dos.h>
#include <sys\scsi.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <_tnb.c>
extern UNchar RG_[256],GG_[256],BG_[256];
extern UNshort RG0[256],GG0[256],BG0[256];
extern UNshort RG1[256],GG1[256],BG1[256];
extern int DataMd;
extern int DataC;
extern int PreDataMd;
extern int PreDataBi;
extern UNchar msp[17];
static short DefocusT[3][3]={
1,2,1,
2,5,2,
1,2,1
};
static short mca[]={1,2,3,-1};
static short mca2[]={6,6,7,7,8,8,-1};
void GG2PSET_64_S(),GG4PSET_64_S(),GG8PSET_64_S();
static void (*_GG_PSETS[8])()={(void*)0,&GG2PSET_64_S,&GG4PSET_64_S,&GG8PSET_64_S};
#define Mul(x,y) MULU(x,y)
//#define Mul(x,y) (x*y)
/**************************************************
スキャン画像表示
**************************************************/
void ScanGraphView(ofx,ofy,mm)
int ofx,ofy,mm;
{
int i,v,l,bi,e,bisx,bisy,vst;
int x,y,xx,z,ye,dataxz;
int ssp;
UNchar *M,*N;
UNshort *V,*W;
int stz,scrx,scry;
int _scrx,_scry;
void (*GGPSETS)();
M=ScanData;
x=ScanDataX-ofx;
y=ScanDataY-ofy;
if ( mm==0 ){
// 記録モード用
stz=16;
scrx=256;
scry=480;
ssp=_iocs_b_super(0);
if ( M==0 ){
GGSP16_64_S(TADDS(3,0),0x02);
GGSP16_64_S(TADDS(4,0),0x02);
GGSP16_64_S(TADDS(5,0),0x02);
} elif ( DataC==0 ){
GGSP16_64_S(TADDS(3,0),0xC2);
GGSP16_64_S(TADDS(4,0),0xC3);
GGSP16_64_S(TADDS(5,0),0xC4);
} elif ( DataMd==5 ){ // フルカラー
GGSP16_64_S(TADDS(3,0),0xC0);
GGSP16_64_S(TADDS(4,0),0xC1);
GGSP16_64_S(TADDS(5,0),0xC4);
} else {
GGSP16_64_S(TADDS(3,0),0xC0);
GGSP16_64_S(TADDS(4,0),0xC5);
GGSP16_64_S(TADDS(5,0),0xC6);
}
if ( ssp>0 )
_iocs_b_super(ssp);
} else {
// 全画面
stz=0;
scrx=512;
scry=512;
}
if ( M==0 ){
struct _fillptr PP;
PP.x1=stz;
PP.y1=stz;
PP.x2=stz+scrx-1;
PP.y2=stz+scry-1;
PP.color=0;
_iocs_fill(&PP);
return;
}
_scrx=scrx+stz;
_scry=scry+stz;
if ( DataC!=0 ){
if ( DataMd==5 ) // フルカラー
z=3;
else z=1;
}
dataxz=DataX*z;
ssp=_iocs_b_super(0);
if ( RecVwBai>0 ){
// 1;x2 2;x4 3;x8
bi=1<<RecVwBai;
bisx=scrx/bi;
bisy=scry/bi;
vst=bi*2;
GGPSETS=_GG_PSETS[RecVwBai];
ye=bisy;
if ( ye>y )
ye=y;
if ( DataC!=0 ){
//===================== 24bit カラー記憶
for(l=0;l<ye;l++){
// printf(" 複走査 = %d(%d)\r",l,y);
N=&M[ Mul(ofx,z)+Mul(l+ofy,dataxz) ];
xx=x;
if ( xx>bisx )
xx=bisx;
v=VADDS(0,stz,Mul(l,bi)+stz);
if ( DataMd==5 ){ // フルカラー
for(i=0;i<xx;i++,N+=3,v+=vst)
GGPSETS(v,RGB(N[0]/8,N[1]/8,N[2]/8));
for(;i<bisx;i++,v+=vst)
GGPSETS(v,0);
} elif ( DataMd==2 ){ // グレイスケール
for(i=0;i<xx;i++,N++,v+=vst){
e=N[0]/8;
GGPSETS(v,RGB(e,e,e));
}
for(;i<bisx;i++,v+=vst)
GGPSETS(v,0);
}
}
} else {
//===================== 64k カラー記憶
for(l=0;l<ye;l++){
// printf(" 複走査 = %d(%d)\r",l,y);
W=&M[ (ofx+Mul(l+ofy,DataX)) *2 ];
xx=x;
if ( xx>bisx )
xx=bisx;
v=VADDS(0,stz,Mul(l,bi)+stz);
for(i=0;i<xx;i++,v+=vst)
GGPSETS(v,*W++);
for(;i<bisx;i++,v+=vst)
GGPSETS(v,0);
}
}
//-- 空白
for(;;l++){
if ( (l*bi)+stz>=_scry )
break;
v=VADDS(0,stz,Mul(l,bi)+stz);
for(i=0;i<bisx;i++,v+=vst)
GGPSETS(v,0);
}
if ( mm==0 ){
ScroolBarX(ScanDataX*bi,256,ofx*bi);
ScroolBarY(ScanDataY*bi,480,ofy*bi);
}
} else {
//0;1 -1;/2 -2;/4 -3;/8
bi=1 << (-RecVwBai);
x/=bi;
y/=bi;
ye=scry;
if ( ye>y )
ye=y;
if ( DataC!=0 ){
//===================== 24bit カラー記憶
for(l=0;l<ye;l++){
// printf(" 複走査 = %d(%d)\r",l,y);
N=&M[ Mul(ofx,z)+Mul(Mul(l,bi)+ofy,dataxz) ];
xx=x;
if ( xx>scrx )
xx=scrx;
V=VADDS(0,stz,l+stz);
if ( DataMd==5 ){ // フルカラー
for(i=0;i<xx;i++){
*V++=RGB(N[0]/8,N[1]/8,N[2]/8);
N+=3*bi;
}
} elif ( DataMd==2 ){ // グレイスケール
for(i=0;i<xx;i++){
e=N[0]/8;
*V++=RGB(e,e,e);
N+=bi;
}
}
for(;i<scrx;i++)
*V++=0;
}
} else {
//===================== 64k カラー記憶
for(l=0;l<ye;l++){
// printf(" 複走査 = %d(%d)\r",l,y);
W=&M[ (ofx+Mul(Mul(l,bi)+ofy,DataX)) *2 ];
xx=x;
if ( xx>scrx )
xx=scrx;
V=VADDS(0,stz,l+stz);
for(i=0;i<xx;i++,W+=bi)
*V++=*W;
for(;i<scrx;i++)
*V++=0;
}
}
for(;;l++){
if ( l+stz>=_scry )
break;
V=VADDS(0,stz,l+stz);
for(i=0;i<scrx;i++)
*V++=0;
}
if ( mm==0 ){
ScroolBarX(ScanDataX/bi,256,ofx/bi);
ScroolBarY(ScanDataY/bi,480,ofy/bi);
}
}
if ( ssp>0 )
_iocs_b_super(ssp);
}
/*----------------------------------------------------------------------*/
/**************************************************
スキャン画像表示
MONO
グレイスケール表示
mm=1;Gray
2;Mono
3;DeFocus
**************************************************/
void ScanGraphView_gm(ofx,ofy,mm)
int ofx,ofy,mm;
{
int i,v,l,bi,bisx,bisy,vst,ofyl;
int x,y,xx,z,x_,ye,om,dataxz;
int ssp;
UNchar *M,*N;
UNshort *V,*W;
int stz,scrx,scry;
int _scrx,_scry;
void (*GGPSETS)();
M=ScanData;
x=ScanDataX-ofx;
y=ScanDataY-ofy;
// 全画面
stz=0;
scrx=512;
scry=512;
if ( M==0 ){
struct _fillptr PP;
PP.x1=stz;
PP.y1=stz;
PP.x2=stz+scrx-1;
PP.y2=stz+scry-1;
PP.color=0;
_iocs_fill(&PP);
return;
}
_iocs_ms_sel2(mca);
om=_iocs_ms_curgt();
_scrx=scrx+stz;
_scry=scry+stz;
if ( DataC!=0 ){
if ( DataMd==5 ) // フルカラー
z=3;
else z=1;
}
DefocusT[1][1]=DefocusPoint*4+8;
dataxz=DataX*z;
ssp=_iocs_b_super(0);
if ( RecVwBai>0 ){
// 1;x2 2;x4 3;x8
bi=1<<RecVwBai;
bisx=scrx/bi;
bisy=scry/bi;
vst=bi*2;
GGPSETS=_GG_PSETS[RecVwBai];
ye=bisy;
if ( ye>y )
ye=y;
if ( DataC!=0 ){
//===================================== 24bit カラー記憶
for(l=0;l<ye;l++){
// printf(" 複走査 = %d(%d)\r",l,y);
ofyl=l+ofy;
N=&M[ Mul(ofx,z)+Mul(ofyl,dataxz) ];
xx=x;
if ( xx>bisx )
xx=bisx;
v=VADDS(0,stz,Mul(l,bi)+stz);
if ( mm==1 ){
//===== グレイスケール化
if ( DataMd==5 ){ // フルカラー
for(i=0;i<xx;i++,N+=3,v+=vst)
GGPSETS(v,GrayColorDisp24_(N[0],N[1],N[2]));
} elif ( DataMd==2 ){ // グレイスケール
; // もともとなので必要なし
}
} elif ( mm==2 ){
//==== 二値化
if ( DataMd==5 ){ // フルカラー
for(i=0;i<xx;i++,N+=3,v+=vst)
GGPSETS(v,MonoColorDisp24_(N[1]));
} elif ( DataMd==2 ){ // グレイスケール
for(i=0;i<xx;i++,N++,v+=vst)
GGPSETS(v,MonoColorDisp24_(N[0]));
}
} elif ( mm==3 ){
//===== 平滑化
if ( DataMd==5 ){ // フルカラー
for(i=0,x_=ofx;i<xx;i++,v+=vst,x_++)
GGPSETS(v,DefocusDisp24_(M,x_,ofyl) );
} elif ( DataMd==2 ){ // グレイスケール
for(i=0,x_=ofx;i<xx;i++,v+=vst,x_++)
GGPSETS(v,DefocusDisp24G_(M,x_,ofyl) );
}
} elif ( mm==4 ){
//===== メディアン化
if ( DataMd==5 ){ // フルカラー
for(i=0,x_=ofx;i<xx;i++,v+=vst,x_++)
GGPSETS(v,MedianDisp24_(M,x_,ofyl) );
} elif ( DataMd==2 ){ // グレイスケール
for(i=0,x_=ofx;i<xx;i++,v+=vst,x_++)
GGPSETS(v,MedianDisp24G_(M,x_,ofyl) );
}
} elif ( mm==5 ){
//===== 鮮鋭化
if ( DataMd==5 ){ // フルカラー
for(i=0,x_=ofx;i<xx;i++,v+=vst,x_++)
GGPSETS(v,SharpDisp24_(M,x_,ofyl) );
} elif ( DataMd==2 ){ // グレイスケール
for(i=0,x_=ofx;i<xx;i++,v+=vst,x_++)
GGPSETS(v,SharpDisp24G_(M,x_,ofyl) );
}
}
if ( MS_RSW() )
break;
_iocs_ms_curst( 8,Mul(l,bi) );
}
} else {
//==================================== 64k カラー記憶
for(l=0;l<ye;l++){
// printf(" 複走査 = %d(%d)\r",l,y);
ofyl=ofy+l;
W=&M[ (ofx+Mul(ofyl,DataX)) *2 ];
xx=x;
if ( xx>bisx )
xx=bisx;
v=VADDS(0,stz,(l*bi)+stz);
if ( mm==1 ){
//==== グレイスケール化
for(i=0;i<xx;i++,v+=vst)
GGPSETS(v,GrayColorDisp64(*W++));
} elif ( mm==2 ){
//==== 二値化
for(i=0;i<xx;i++,v+=vst)
GGPSETS(v,MonoColorDisp64(*W++));
} elif ( mm==3 ){
//==== 平滑化
for(i=0,x_=ofx;i<xx;i++,v+=vst,x_++)
GGPSETS(v,DefocusDisp64(M,x_,ofyl) );
} elif ( mm==4 ){
//==== メディアン化
for(i=0,x_=ofx;i<xx;i++,v+=vst,x_++)
GGPSETS(v,MedianDisp64(M,x_,ofyl) );
} elif ( mm==5 ){
//==== 鮮鋭化
for(i=0,x_=ofx;i<xx;i++,v+=vst,x_++)
GGPSETS(v,SharpDisp64(M,x_,ofyl) );
}
if ( MS_RSW() )
break;
_iocs_ms_curst( 8,Mul(l,bi) );
}
}
} else {
//0;1 -1;/2 -2;/4 -3;/8
bi=1 << (-RecVwBai);
x/=bi;
y/=bi;
ye=scry;
if ( ye>y )
ye=y;
if ( DataC!=0 ){
//============================= 24bit カラー記憶
for(l=0;l<ye;l++){
// printf(" 複走査 = %d(%d)\r",l,y);
ofyl=ofy+l*bi;
N=&M[ Mul(ofx,z)+Mul(ofyl,dataxz) ];
xx=x;
if ( xx>scrx )
xx=scrx;
V=VADDS(0,stz,l+stz);
if ( mm==1 ){
//==== グレイスケール化
if ( DataMd==5 ){ // フルカラー
for(i=0;i<xx;i++,N+=3*bi)
*V++=GrayColorDisp24_(N[0],N[1],N[2]);
} elif ( DataMd==2 ){ // グレイスケール
;
}
} elif ( mm==2 ){
//==== 二値化
if ( DataMd==5 ){ // フルカラー
for(i=0;i<xx;i++,N+=3*bi)
*V++=MonoColorDisp24_(N[1]);
} elif ( DataMd==2 ){ // グレイスケール
for(i=0;i<xx;i++,N+=bi)
*V++=MonoColorDisp24_(N[0]);
}
} elif ( mm==3 ){
//==== 平滑化
if ( DataMd==5 ){ // フルカラー
for(i=0,x_=ofx;i<xx;i++,x_+=bi)
*V++=DefocusDisp24_(M,x_,ofyl);
} elif ( DataMd==2 ){ // グレイスケール
for(i=0,x_=ofx;i<xx;i++,x_+=bi)
*V++=DefocusDisp24G_(M,x_,ofyl);
}
} elif ( mm==4 ){
//==== メディアン化
if ( DataMd==5 ){ // フルカラー
for(i=0,x_=ofx;i<xx;i++,x_+=bi)
*V++=MedianDisp24_(M,x_,ofyl);
} elif ( DataMd==2 ){ // グレイスケール
for(i=0,x_=ofx;i<xx;i++,x_+=bi)
*V++=MedianDisp24G_(M,x_,ofyl);
}
} elif ( mm==5 ){
//==== 鮮鋭化
if ( DataMd==5 ){ // フルカラー
for(i=0,x_=ofx;i<xx;i++,x_+=bi)
*V++=SharpDisp24_(M,x_,ofyl);
} elif ( DataMd==2 ){ // グレイスケール
for(i=0,x_=ofx;i<xx;i++,x_+=bi)
*V++=SharpDisp24G_(M,x_,ofyl);
}
}
if ( MS_RSW() )
break;
_iocs_ms_curst( 8,l);
}
} else {
//================================ 64k カラー記憶
for(l=0;l<ye;l++){
// printf(" 複走査 = %d(%d)\r",l,y);
ofyl=ofy+l*bi;
W=&M[ (ofx+Mul(ofyl,DataX)) *2 ];
xx=x;
if ( xx>scrx )
xx=scrx;
V=VADDS(0,stz,l+stz);
if ( mm==1 ){
for(i=0;i<xx;i++,W+=bi)
*V++=GrayColorDisp64(*W);
} elif ( mm==2 ){
//==== 2値化
for(i=0;i<xx;i++,W+=bi)
*V++=MonoColorDisp64(*W);
} elif ( mm==3 ){
//==== 平滑化
for(i=0,x_=ofx;i<xx;i++,x_+=bi)
*V++=DefocusDisp64(M,x_,ofyl);
} elif ( mm==4 ){
//==== メディアン化
for(i=0,x_=ofx;i<xx;i++,x_+=bi)
*V++=MedianDisp64(M,x_,ofyl);
} elif ( mm==5 ){
//==== 鮮鋭化
for(i=0,x_=ofx;i<xx;i++,x_+=bi)
*V++=SharpDisp64(M,x_,ofyl);
}
if ( MS_RSW() )
break;
_iocs_ms_curst( 8,l);
}
}
}
if ( ssp>0 )
_iocs_b_super(ssp);
MsPat(1);
_iocs_ms_curst( om/0x10000,om&0xFFFF );
}
/*----------------------------------------------------------------------*/
/* 各処理 */
/*----------------------------------------------------------------------*/
/**************************
2値化 24bit カラー
***************************/
inline static int MonoColorDisp24(g)
int g;
{
int i;
i=(g<MonoPoint)?0:255;
return( i );
}
/*+++DATA用+++*/
inline static int MonoColorDisp24_(g)
int g;
{
int i;
i=MonoColorDisp24(g);
i=(g<MonoPoint)?0:65535;
return( i );
}
/**************************
2値化 64kカラー
***************************/
inline static int MonoColorDisp64(c)
int c;
{
int i;
i=((GG(c)*8)<MonoPoint)?0:65535;
return(i);
}
/*----------------------------------------*/
/**************************
グレイスケール化 24bitカラー
***************************/
inline static int GrayColorDisp24(r,g,b)
int r,g,b;
{
int i;
//i=DIVU( MULU(g,GrayPoint)+MULU(b,31-GrayPoint),31);
i=MULU(g,GrayPoint)+MULU(b,31-GrayPoint);
i=DIVU( i,31 );
i=(i*3+r)/4;
return(i);
}
/*+++DATA用+++*/
inline static int GrayColorDisp24_(r,g,b)
int r,g,b;
{
int i;
i=GrayColorDisp24(r,g,b);
i/=8;
return(RGB(i,i,i));
}
/**************************
グレイスケール化 64kカラー
***************************/
inline static int GrayColorDisp64(c)
int c;
{
int i,r,g,b;
r=RR(c);
g=GG(c);
b=BB(c);
i=GrayColorDisp24(r,g,b);
return( RGB(i,i,i) );
}
/*----------------------------------------*/
/**************************
平滑化 24bitカラー
***************************/
inline static int DefocusDisp24(bb,sx,sy)
UNchar *bb; // DataX*3 幅のバッファ
int sx,sy; // b[x+y*DataX] に元データ
{
int i,x,y,z;
int r,g,b;
z=0; r=0; g=0; b=0;
for(y=sy-1;y<=sy+1;y++){
if ( y<0 || y>=ScanDataY )
continue;
for(x=sx-1;x<=sx+1;x++){
if ( x<0 || x>=ScanDataX )
continue;
i=DefocusT[y-sy+1][x-sx+1];
z+=i;
r+=MULU( bb[(x+MULU(y,DataX))*3+0],i );
g+=MULU( bb[(x+MULU(y,DataX))*3+1],i );
b+=MULU( bb[(x+MULU(y,DataX))*3+2],i );
}
}
if ( z==0 )
return(0);
r=DIVU(r,z);
g=DIVU(g,z);
b=DIVU(b,z);
return( r*0x10000+g*0x100+b );
}
/*+++++++++*/
inline static int DefocusDisp24_(bb,sx,sy)
UNchar *bb; // DataX*3 幅のバッファ
int sx,sy; // b[x+y*DataX] に元データ
{
int c;
c=DefocusDisp24(bb,sx,sy);
return( RGB( ((c/0x10000)&0xFF)/8,((c/0x100)&0xFF)/8,(c&0xFF)/8) );
}
/**************************
平滑化 24bitグレイスケール
***************************/
inline static int DefocusDisp24G(bb,sx,sy)
UNchar *bb; // DataX 幅のバッファ
int sx,sy; // b[x+y*DataX] に元データ
{
int i,c,x,y,z;
int r;
z=0; r=0;
for(y=sy-1;y<=sy+1;y++){
if ( y<0 || y>=ScanDataY )
continue;
for(x=sx-1;x<=sx+1;x++){
if ( x<0 || x>=ScanDataX )
continue;
i=DefocusT[y-sy+1][x-sx+1];
z+=i;
r+=MULU( bb[x+MULU(y,DataX)],i );
}
}
if ( z==0 )
return(0);
r=DIVU(r,z);
return( r );
}
/*+++++++++*/
inline static int DefocusDisp24G_(bb,sx,sy)
UNchar *bb; // DataX*3 幅のバッファ
int sx,sy; // b[x+y*DataX] に元データ
{
int c;
c=DefocusDisp24G(bb,sx,sy);
c=(c&0xFF)/8;
return( RGB(c,c,c) );
}
/**************************
平滑化 64kカラー
***************************/
inline static int DefocusDisp64(bb,sx,sy)
UNshort *bb; // DataX 幅のバッファ
int sx,sy; // b[x+y*DataX] に元データ
{
int i,c,x,y,z;
int r,g,b;
z=0; r=0; g=0; b=0;
for(y=sy-1;y<=sy+1;y++){
if ( y<0 || y>=ScanDataY )
continue;
for(x=sx-1;x<=sx+1;x++){
if ( x<0 || x>=ScanDataX )
continue;
i=DefocusT[y-sy+1][x-sx+1];
z+=i;
c=bb[x+MULU(y,DataX)];
r+=MULU( RR(c),i );
g+=MULU( GG(c),i );
b+=MULU( BB(c),i );
}
}
if ( z==0 )
return(0);
r=DIVU(r,z);
g=DIVU(g,z);
b=DIVU(b,z);
return( RGB(r,g,b) );
}
/*----------------------------------------*/
/**************************
メディアン化 24bitカラー
***************************/
inline static int MedianDisp24(bb,sx,sy)
UNchar *bb; // DataX*3 幅のバッファ
int sx,sy; // b[x+y*DataX] に元データ
{
int r,g,b;
if ( sx<1 || sx>=ScanDataX-1 || sy<1 || sy>=ScanDataY-1 ){
r=bb[(sx+MULU(sy,DataX))*3+0];
g=bb[(sx+MULU(sy,DataX))*3+1];
b=bb[(sx+MULU(sy,DataX))*3+2];
} else {
r=sort5intM(
bb[((sx )+MULU((sy ),DataX))*3+0],
bb[((sx+1)+MULU((sy ),DataX))*3+0],
bb[((sx )+MULU((sy-1),DataX))*3+0],
bb[((sx-1)+MULU((sy ),DataX))*3+0],
bb[((sx )+MULU((sy+1),DataX))*3+0]
);
g=sort5intM(
bb[((sx )+MULU((sy ),DataX))*3+1],
bb[((sx+1)+MULU((sy ),DataX))*3+1],
bb[((sx )+MULU((sy-1),DataX))*3+1],
bb[((sx-1)+MULU((sy ),DataX))*3+1],
bb[((sx )+MULU((sy+1),DataX))*3+1]
);
b=sort5intM(
bb[((sx )+MULU((sy ),DataX))*3+2],
bb[((sx+1)+MULU((sy ),DataX))*3+2],
bb[((sx )+MULU((sy-1),DataX))*3+2],
bb[((sx-1)+MULU((sy ),DataX))*3+2],
bb[((sx )+MULU((sy+1),DataX))*3+2]
);
}
return( r*0x10000+g*0x100+b );
}
/*+++++++++*/
inline static int MedianDisp24_(bb,sx,sy)
UNchar *bb; // DataX*3 幅のバッファ
int sx,sy; // b[x+y*DataX] に元データ
{
int c;
c=MedianDisp24(bb,sx,sy);
return( RGB( ((c/0x10000)&0xFF)/8,((c/0x100)&0xFF)/8,(c&0xFF)/8) );
}
/**************************
メディアン化 24bitグレイスケール
***************************/
inline static int MedianDisp24G(bb,sx,sy)
UNchar *bb; // DataX*3 幅のバッファ
int sx,sy; // b[x+y*DataX] に元データ
{
int r;
if ( sx<1 || sx>=ScanDataX-1 || sy<1 || sy>=ScanDataY-1 ){
r=bb[sx+MULU(sy,DataX)];
} else {
r=sort5intM(
bb[(sx )+MULU((sy ),DataX)],
bb[(sx+1)+MULU((sy ),DataX)],
bb[(sx )+MULU((sy-1),DataX)],
bb[(sx-1)+MULU((sy ),DataX)],
bb[(sx )+MULU((sy+1),DataX)]
);
}
return( r );
}
/*+++++++++*/
inline static int MedianDisp24G_(bb,sx,sy)
UNchar *bb; // DataX*3 幅のバッファ
int sx,sy; // b[x+y*DataX] に元データ
{
int c;
c=MedianDisp24G(bb,sx,sy);
c=(c&0xFF)/8;
return( RGB(c,c,c) );
}
/**************************
メディアン化 64kカラー
***************************/
inline static int MedianDisp64(bb,sx,sy)
UNshort *bb; // DataX 幅のバッファ
int sx,sy; // b[x+y*DataX] に元データ
{
int r,g,b;
if ( sx<1 || sx>=ScanDataX-1 || sy<1 || sy>=ScanDataY-1 ){
return( bb[sx+MULU(sy,DataX)] );
}
r=sort5intM(
RR( bb[(sx )+MULU((sy ),DataX)] ),
RR( bb[(sx+1)+MULU((sy ),DataX)] ),
RR( bb[(sx )+MULU((sy-1),DataX)] ),
RR( bb[(sx-1)+MULU((sy ),DataX)] ),
RR( bb[(sx )+MULU((sy+1),DataX)] )
);
g=sort5intM(
GG( bb[(sx )+MULU((sy ),DataX)] ),
GG( bb[(sx+1)+MULU((sy ),DataX)] ),
GG( bb[(sx )+MULU((sy-1),DataX)] ),
GG( bb[(sx-1)+MULU((sy ),DataX)] ),
GG( bb[(sx )+MULU((sy+1),DataX)] )
);
b=sort5intM(
BB( bb[(sx )+MULU((sy ),DataX)] ),
BB( bb[(sx+1)+MULU((sy ),DataX)] ),
BB( bb[(sx )+MULU((sy-1),DataX)] ),
BB( bb[(sx-1)+MULU((sy ),DataX)] ),
BB( bb[(sx )+MULU((sy+1),DataX)] )
);
return( RGB(r,g,b) );
}
/*----------------------------------------*/
/**************************
鮮鋭化 24bitカラー
***************************/
inline static int SharpDisp24(bb,sx,sy)
UNchar *bb; // DataX*3 幅のバッファ
int sx,sy; // b[x+y*DataX] に元データ
{
int i,r,g,b;
static short ssx[4]={-1,0,1,0};
static short ssy[4]={0,-1,0,1};
if ( sx<1 || sx>=ScanDataX-1 || sy<1 || sy>=ScanDataY-1 ){
r=bb[(sx+MULU(sy,DataX))*3+0];
g=bb[(sx+MULU(sy,DataX))*3+1];
b=bb[(sx+MULU(sy,DataX))*3+2];
} else {
r=bb[(sx+MULU(sy,DataX))*3+0]*8;
g=bb[(sx+MULU(sy,DataX))*3+1]*8;
b=bb[(sx+MULU(sy,DataX))*3+2]*8;
for(i=0;i<4;i++){
r-=bb[((sx+ssx[i])+MULU((sy+ssy[i]),DataX))*3+0];
g-=bb[((sx+ssx[i])+MULU((sy+ssy[i]),DataX))*3+1];
b-=bb[((sx+ssx[i])+MULU((sy+ssy[i]),DataX))*3+2];
}
r/=4; g/=4; b/=4;
if ( r<0 ) r=0;
if ( g<0 ) g=0;
if ( b<0 ) b=0;
if ( r>255 ) r=255;
if ( g>255 ) g=255;
if ( b>255 ) b=255;
}
return( r*0x10000+g*0x100+b );
}
/*+++++++++*/
inline static int SharpDisp24_(bb,sx,sy)
UNchar *bb; // DataX*3 幅のバッファ
int sx,sy; // b[x+y*DataX] に元データ
{
int c;
c=SharpDisp24(bb,sx,sy);
return( RGB( ((c/0x10000)&0xFF)/8,((c/0x100)&0xFF)/8,(c&0xFF)/8) );
}
/**************************
鮮鋭化 24bitグレイスケール
***************************/
inline static int SharpDisp24G(bb,sx,sy)
UNchar *bb; // DataX*3 幅のバッファ
int sx,sy; // b[x+y*DataX] に元データ
{
int i,r;
static short ssx[4]={-1,0,1,0};
static short ssy[4]={0,-1,0,1};
if ( sx<1 || sx>=ScanDataX-1 || sy<1 || sy>=ScanDataY-1 ){
r=bb[sx+MULU(sy,DataX)];
} else {
r=bb[sx+MULU(sy,DataX)]*8;
for(i=0;i<4;i++){
r-=bb[(sx+ssx[i])+MULU((sy+ssy[i]),DataX)];
}
r/=4;
if ( r<0 ) r=0;
if ( r>255 ) r=255;
}
return( r );
}
/*+++++++++*/
inline static int SharpDisp24G_(bb,sx,sy)
UNchar *bb; // DataX*3 幅のバッファ
int sx,sy; // b[x+y*DataX] に元データ
{
int c;
c=SharpDisp24G(bb,sx,sy);
c=(c&0xFF)/8;
return( RGB(c,c,c) );
}
/**************************
鮮鋭化 64kカラー
***************************/
inline static int SharpDisp64(bb,sx,sy)
UNshort *bb; // DataX 幅のバッファ
int sx,sy; // b[x+y*DataX] に元データ
{
int i,c;
int r,g,b;
static short ssx[4]={-1,0,1,0};
static short ssy[4]={0,-1,0,1};
if ( sx<1 || sx>=ScanDataX-1 || sy<1 || sy>=ScanDataY-1 ){
return( bb[sx+MULU(sy,DataX)] );
}
c=bb[sx+MULU(sy,DataX)];
r=RR(c)*8;
g=GG(c)*8;
b=BB(c)*8;
for(i=0;i<4;i++){
c=bb[(sx+ssx[i])+MULU((sy+ssy[i]),DataX)];
r-=RR(c);
g-=GG(c);
b-=BB(c);
}
r/=4; g/=4; b/=4;
if ( r<0 ) r=0;
if ( g<0 ) g=0;
if ( b<0 ) b=0;
if ( r>31 ) r=31;
if ( g>31 ) g=31;
if ( b>31 ) b=31;
return( RGB(r,g,b) );
}
/***********************************************************************
2値化
***********************************************************************/
void SetMono()
{
int i,l,m,x,y;
int om;
UNchar *M,*N;
UNshort *W;
M=ScanData;
x=ScanDataX;
y=ScanDataY;
_iocs_ms_sel2(mca2);
om=_iocs_ms_curgt();
if ( DataC!=0 ){
//===================== 24bit カラー記憶
for(l=0;l<ScanDataY;l++){
if ( DataMd==5 ){ // フルカラー
N=&M[ l*DataX*3 ];
for(i=0;i<ScanDataX;i++,N+=3){
m=MonoColorDisp24(N[1]);
N[0]= N[1]= N[2]=m;
}
} elif ( DataMd==2 ){ // グレイスケール
N=&M[ l*DataX ];
for(i=0;i<ScanDataX;i++,N++){
*N=MonoColorDisp24(*N);
}
}
_iocs_ms_curst( DIVU(MULU(l,496),ScanDataY),512-16);
}
} else {
//===================== 64k カラー記憶
for(l=0;l<ScanDataY;l++){
W=&M[ (l*DataX) *2 ];
for(i=0;i<ScanDataX;i++,W++)
*W=MonoColorDisp64(*W);
_iocs_ms_curst( DIVU(MULU(l,496),ScanDataY),512-16);
}
}
MsPat(1);
_iocs_ms_curst( om/0x10000,om&0xFFFF );
}
/***********************************************************************
グレイスケール化
***********************************************************************/
void SetGray()
{
int i,l,m,x,y;
int om;
UNchar *M,*N;
UNshort *W;
M=ScanData;
x=ScanDataX;
y=ScanDataY;
_iocs_ms_sel2(mca2);
om=_iocs_ms_curgt();
if ( DataC!=0 ){
//===================== 24bit カラー記憶
for(l=0;l<ScanDataY;l++){
if ( DataMd==5 ){ // フルカラー
N=&M[ l*DataX*3 ];
for(i=0;i<ScanDataX;i++,N+=3){
m=GrayColorDisp24(N[0],N[1],N[2]);
N[0]= N[1]= N[2]=m;
}
} elif ( DataMd==2 ){ // グレイスケール
N=&M[ l*DataX ];
for(i=0;i<ScanDataX;i++,N++){
*N=GrayColorDisp24(*N,*N,*N);
}
}
_iocs_ms_curst( DIVU(MULU(l,496),ScanDataY),512-16);
}
} else {
//===================== 64k カラー記憶
for(l=0;l<ScanDataY;l++){
W=&M[ (l*DataX) *2 ];
for(i=0;i<ScanDataX;i++,W++)
*W=GrayColorDisp64(*W);
_iocs_ms_curst( DIVU(MULU(l,496),ScanDataY),512-16);
}
}
MsPat(1);
_iocs_ms_curst( om/0x10000,om&0xFFFF );
}
/***********************************************************************
平滑化
***********************************************************************/
void SetDefocus()
{
if ( DataC!=0 ){
if ( DataMd==5 ){ // フルカラー
SetOthar(DefocusDisp24);
} else {
SetOthar(DefocusDisp24G);
}
} else {
SetOthar(DefocusDisp64);
}
}
/***********************************************************************
メディアン化
***********************************************************************/
void SetMedian()
{
if ( DataC!=0 ){
if ( DataMd==5 ){ // フルカラー
SetOthar(MedianDisp24);
} else {
SetOthar(MedianDisp24G);
}
} else {
SetOthar(MedianDisp64);
}
}
/***********************************************************************
鮮鋭化
***********************************************************************/
void SetSharp()
{
if ( DataC!=0 ){
if ( DataMd==5 ){ // フルカラー
SetOthar(SharpDisp24);
} else {
SetOthar(SharpDisp24G);
}
} else {
SetOthar(SharpDisp64);
}
}
/**************************************************
汎用
****************************************************/
void SetOthar(sub)
int (*sub)();
{
int i,l,x,y;
int om;
UNchar *M,*N;
UNshort *W;
_iocs_ms_sel2(mca2);
om=_iocs_ms_curgt();
M=ScanData;
x=ScanDataX;
y=ScanDataY;
if ( DataC!=0 ){
//===================== 24bit カラー記憶
if ( DataMd==5 ){ // フルカラー
UNint bf1[4096],bf2[4096];
for(l=0;l<=ScanDataY;l++){
if ( l<ScanDataY ){
for(i=0;i<ScanDataX;i++)
bf1[i]=sub(M,i,l);
}
if ( l>0 ){
N=&M[ MULU((l-1),DataX)*3 ];
for(i=0;i<ScanDataX;i++,N+=3){
N[0]=(bf2[i]/0x10000)&0xFF;
N[1]=(bf2[i]/0x100) &0xFF;
N[2]= bf2[i] &0xFF;
bf2[i]=bf1[i];
}
} else {
for(i=0;i<ScanDataX;i++)
bf2[i]=bf1[i];
}
_iocs_ms_curst( DIVU(MULU(l,496),ScanDataY),512-16);
}
} elif ( DataMd==2 ){ // グレイスケール
UNchar bf1[4096],bf2[4096];
for(l=0;l<=ScanDataY;l++){
if ( l<ScanDataY ){
for(i=0;i<ScanDataX;i++)
bf1[i]=sub(M,i,l);
}
if ( l>0 ){
N=&M[ MULU((l-1),DataX) ];
for(i=0;i<ScanDataX;i++,N++){
N[0]=bf2[i];
bf2[i]=bf1[i];
}
} else {
for(i=0;i<ScanDataX;i++)
bf2[i]=bf1[i];
}
_iocs_ms_curst( DIVU(MULU(l,496),ScanDataY),512-16);
}
}
} else {
//===================== 64k カラー記憶
UNshort bf1[4096],bf2[4096];
for(l=0;l<=ScanDataY;l++){
if ( l<ScanDataY ){
for(i=0;i<ScanDataX;i++)
bf1[i]=sub(M,i,l);
}
if ( l>0 ){
W=&M[ MULU((l-1),DataX) *2 ];
for(i=0;i<ScanDataX;i++){
*W++=bf2[i];
bf2[i]=bf1[i];
}
} else {
for(i=0;i<ScanDataX;i++)
bf2[i]=bf1[i];
}
_iocs_ms_curst( DIVU(MULU(l,496),ScanDataY),512-16);
}
}
MsPat(1);
_iocs_ms_curst( om/0x10000,om&0xFFFF );
}